//Function.prototype.call和Function.prototype.apply都是非常常用的方法。它们的作用一模一样，区别仅在于传入参数形式的不同。
//apply接受两个参数，第一个参数指定了函数体内this对象的指向，第二个参数为一个带下标的集合，这个集合可以为数组，也可以为类数组，apply方法把这个集合中的元素作为参数传递给被调用的函数：

//apply 方法把这个集合中的元素作为参数传递给被调用的函数：
var func = function( a, b, c ){
    console.log ( [ a, b, c ] ); // 输出 [ 1, 2, 3 ]
};

func.apply( null, [ 1, 2, 3 ] );

//call传入的参数数量不固定，跟apply相同的是，第一个参数也是代表函数体内的this指向，从第二个参数开始往后，每个参数被依次传入函数：
//从第二个参数开始往后，每个参数被依次传入函数：
var func = function( a, b, c ){
    console.log ( [ a, b, c ] ); // 输出 [ 1, 2, 3 ]
};

func.call( null, 1, 2, 3 );

//当使用call 或者apply 的时候，如果我们传入的第一个参数为null，函数体内的this 会指向默认的宿主对象，在浏览器中则是window：
var func = function( a, b, c ){
    console.log ( this === window ); // 输出true
};

func.apply( null, [ 1, 2, 3 ] );

//但如果是在严格模式下，函数体内的this 还是为null：

var func = function( a, b, c ){
    "use strict";
    console.log ( this === null ); // 输出true
}

func.apply( null, [ 1, 2, 3 ] );

//比如借用其他对象的方法。那么我们可以传入null 来代替某个具体的对象：
Math.max.apply( null, [ 1, 2, 5, 3, 4 ] ) // 输出：5